<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="lib/react.development.js"></script>
    <script src="lib/react-dom.development.js"></script>
    <script src="lib/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
</body>
<script type="text/babel">
    const root = ReactDOM.createRoot(document.querySelector("#root"));
    class App extends React.Component{
        state = {
            num:0
        }
        // constructor() {
        //     super();
        //     console.log("constructor");
        // }
        // UNSAFE_componentWillMount(){
        //     console.log("UNSAFE_componentWillMount");
        // }
        render(){
            console.log("app->render");
            return (
                <div>
                    <button onClick={()=>this.setState({num:this.state.num+1})}>{this.state.num}</button>
                    <Child num={this.state.num}></Child>
                </div>
            )
        }
        // componentDidMount(){
        //     console.log("componentDidMount");
        // }
    }
    class Child extends React.Component{
        // constructor() {
        //     super();
        //     console.log("child->constructor");
        // }
        // UNSAFE_componentWillMount(){
        //     console.log("child->UNSAFE_componentWillMount");
        // }
        state = {
            num:this.props.num
        }
        UNSAFE_componentWillReceiveProps(nextProps){
            // 接收到的参数是最新的props,但该函数中如果调用this.props还是之前的。
            // 该钩子执行时，属性还未更新。
            // this.state.num = nextProps.num;
            // 作用：可以将接收的属性作为状态
            console.log("1-componentWillReceiveProps",nextProps.num,this.props.num)
        }
        // 返回的必须是一个布尔值
        shouldComponentUpdate(nextProps){
            // 当前的实例下的props属性未更新，作用：可以通过返回值决定是否重新渲染界面
            console.log("2-shouldComponentUpdate",nextProps.num,this.props.num)
            if(nextProps.num>5) return false;
            return true;
        }
        UNSAFE_componentWillUpdate(nextProps){
            // 更新之前执行
            console.log("3-UNSAFE_componentWillUpdate",nextProps.num,this.props.num)
        }
        render(){
            console.log("4-child->render",this.props.num)
            return (
                <div>
                    <h3>Child:{this.props.num}</h3>
                    <p>this.state.num--->{this.state.num}</p>
                </div>
            )
        }
        componentDidUpdate(prevProps){
            console.log("5-componentDidUpdate",prevProps.num,this.props.num);
        }
        // componentDidMount(){
        //     console.log("child->componentDidMount");
        // }
    }
    root.render((
        <App></App>
    ))
</script>
</html>